package com.educatioin.manage.web.studytours.controller;

import com.educatioin.commons.util.AjaxResult;
import com.educatioin.manage.common.beans.Response;
import com.educatioin.manage.web.studytours.entity.StudyToursProductEntity;
import com.educatioin.manage.web.studytours.po.StudyToursProductPo;
import com.educatioin.manage.web.studytours.repository.StudyToursProductRepository;
import com.educatioin.manage.web.studytours.request.QueryStudyToursProductsReq;
import com.educatioin.manage.web.studytours.response.QueryStudyToursProductsRsp;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.persistence.criteria.Predicate;
import java.util.List;

/**
 * Created by zhangchen on 2018/3/5.
 */
@RestController
@RequestMapping(value = {"/api/studyTours"})
public class StudyToursController {

    @Autowired
    private StudyToursProductRepository studyToursProductRepository;

    /**
     * 分页查询游学产品列表
     * @param queryStudyToursProductsReq
     * @return
     */
    @RequestMapping("/queryStudyToursProducts")
    @ResponseBody
    public QueryStudyToursProductsRsp queryStudyToursProducts(QueryStudyToursProductsReq queryStudyToursProductsReq) {
        QueryStudyToursProductsRsp queryStudyToursProductsRsp = new QueryStudyToursProductsRsp();

        Integer page = queryStudyToursProductsReq.getPage();
        Integer limit = queryStudyToursProductsReq.getLimit();
        if(null == page || page <= 0 || null == limit || limit <= 0){
            queryStudyToursProductsRsp.setReturnCode(Response.RETURN_FAIL_CODE);
            queryStudyToursProductsRsp.setReturnMsg("分页查询错误！");
            return queryStudyToursProductsRsp;
        }

        if(page > 0) {
            page = page -1;
        }
        Sort sort = new Sort(Sort.Direction.DESC, "id");
        Pageable pageRequest = new PageRequest(page, limit, sort);

        String name = queryStudyToursProductsReq.getName();
        String generation = queryStudyToursProductsReq.getGeneration();
        String country = queryStudyToursProductsReq.getCountry();

        Page<StudyToursProductPo> retPage = studyToursProductRepository.findAll((root, query, cb) -> {
            List<Predicate> predicates = Lists.newArrayList();
            if(StringUtils.isNoneBlank(name)) {
                predicates.add(cb.and(cb.like(root.get("name"), name)));
            }
            if(StringUtils.isNoneBlank(generation)) {
                predicates.add(cb.and(cb.like(root.get("generation"), generation)));
            }
            if(StringUtils.isNoneBlank(country)) {
                predicates.add(cb.and(cb.like(root.get("country"), country)));
            }
            return cb.and(predicates.toArray(new Predicate[predicates.size()]));
        }, pageRequest);

        queryStudyToursProductsRsp.setReturnCode(Response.RETURN_SUCCESS_CODE);
        if(retPage.hasContent()) {
            List<StudyToursProductEntity> studyToursProductEntities = Lists.newArrayList();
            for(StudyToursProductPo studyToursProductPo : retPage.getContent()){
                StudyToursProductEntity studyToursProductEntity = new StudyToursProductEntity();
                studyToursProductEntity.setId(studyToursProductPo.getId());
                studyToursProductEntity.setCode(studyToursProductPo.getCode());
                studyToursProductEntity.setCountry(studyToursProductPo.getCountry());
                studyToursProductEntity.setDeposit(studyToursProductPo.getDeposit());
                studyToursProductEntity.setGeneration(studyToursProductPo.getGeneration());
                studyToursProductEntity.setName(studyToursProductPo.getName());
                studyToursProductEntity.setPrice(studyToursProductPo.getPrice());
                studyToursProductEntities.add(studyToursProductEntity);
            }
            queryStudyToursProductsRsp.setData(studyToursProductEntities);
        }
        queryStudyToursProductsRsp.setCount((int)retPage.getTotalElements());
        return queryStudyToursProductsRsp;
    }

    /**
     * 同步游学产品（新增、编辑）
     * @param studyToursProductPo
     * @return
     */
    @RequestMapping("/sync")
    @ResponseBody
    public AjaxResult<String> syncStudyToursProduct(@RequestBody StudyToursProductPo studyToursProductPo) {
        AjaxResult<String> result = new AjaxResult<>();

        if(studyToursProductPo.getId() != null) {
            StudyToursProductPo dbStudyToursProductPo = studyToursProductRepository.findOne(studyToursProductPo.getId());
            dbStudyToursProductPo.setName(studyToursProductPo.getName());
            dbStudyToursProductPo.setShowImage(studyToursProductPo.getShowImage());
            dbStudyToursProductPo.setCode(studyToursProductPo.getCode());
            dbStudyToursProductPo.setGeneration(studyToursProductPo.getGeneration());
            dbStudyToursProductPo.setCountry(studyToursProductPo.getCountry());
            dbStudyToursProductPo.setPrice(studyToursProductPo.getPrice());
            dbStudyToursProductPo.setDeposit(studyToursProductPo.getDeposit());
            dbStudyToursProductPo.setDetail(studyToursProductPo.getDetail());
            dbStudyToursProductPo.setSchedule(studyToursProductPo.getSchedule());
            dbStudyToursProductPo.setDescription(studyToursProductPo.getDescription());

            StudyToursProductPo resp = studyToursProductRepository.save(dbStudyToursProductPo);
            if(resp == null) {
                result.setCode(AjaxResult.ERROR_CODE);
                result.setMsg("更新游学产品失败");
                return result;
            }
        } else {
            StudyToursProductPo resp = studyToursProductRepository.save(studyToursProductPo);
            if(resp == null) {
                result.setCode(AjaxResult.ERROR_CODE);
                result.setMsg("新增游学产品失败");
                return result;
            }
        }
        return result;
    }

    /**
     * 删除游学产品（单个）
     * @param id
     * @return
     */
    @RequestMapping("/delete")
    @ResponseBody
    public AjaxResult<String> deleteStudyToursProduct(Long id) {
        AjaxResult<String> result = new AjaxResult<>();
        StudyToursProductPo studyToursProductPo = studyToursProductRepository.findOne(id);
        if(null == studyToursProductPo){
            result.setCode(AjaxResult.ERROR_CODE);
            result.setMsg("找不到删除对象！");
            return result;
        }

        studyToursProductRepository.delete(studyToursProductPo);
        result.setCode(AjaxResult.SUCCESS_CODE);
        result.setMsg("删除成功");
        return result;
    }

    /**
     * 获取游学产品详情
     * @param studyToursProductId
     * @return
     */
    @RequestMapping("/detail")
    @ResponseBody
    public AjaxResult<StudyToursProductPo> findById(Long studyToursProductId) {
        AjaxResult<StudyToursProductPo> ar = new AjaxResult<>();

        StudyToursProductPo studyToursProductPo = studyToursProductRepository.findOne(studyToursProductId);

        if(null == studyToursProductPo){
            ar.setCode(AjaxResult.ERROR_CODE);
            ar.setMsg("游学产品不存在！");
            return ar;
        }

        ar.setCode(AjaxResult.SUCCESS_CODE);
        ar.setData(studyToursProductPo);
        return ar;
    }
}
